/*
 * Descompresor.cpp
 *
 *  Created on: 28/11/2012
 *      Author: d
 */

#include "Descompresor.h"
#include <iostream>
using namespace std;

Descompresor::Descompresor(ColeccionDeBits* coleccionDeBits){
	coleccionDeBits1=new ColeccionDeBits();
	coleccionDeBits2=new ColeccionDeBits();
	bool leyoPrimeraParte=false;

	for(int i=4;i<coleccionDeBits->tamanio();i++){

	int bit=coleccionDeBits->obtenerElementoEnPosicion(i);

	if(!leyoPrimeraParte){

		if(bit==0)
			leyoPrimeraParte=true;

		coleccionDeBits1->agregarElementoAlFinal(bit);
	}else{
		if(bit!=VALOR_IRRELEVANTE)
			coleccionDeBits2->agregarElementoAlFinal(bit);
		else
			break;
	}
	}
	utilidades=Utilidades();
	
	//-nuevo
	int cantidadDeBits=coleccionDeBits1->tamanio()-1;
	coleccionDeBits2->compresionAIzquierda(cantidadDeBits);
}

Descompresor::Descompresor(ColeccionDeBits* unaColeccionDeBits1,ColeccionDeBits* unaColeccionDeBits2) {
	// TODO Auto-generated constructor stub
	coleccionDeBits1=unaColeccionDeBits1;
	coleccionDeBits2=unaColeccionDeBits2;
	utilidades=Utilidades();
}

int Descompresor::obtenerParteEntera1(){
	coleccionDeBits1->eliminarElUltimoBit();
	int tamanio=coleccionDeBits1->tamanio();
	return utilidades.potenciaBaseDos(tamanio);
}

int Descompresor::obtenerParteEntera2(){

	 return obtenerRepresentacionDecimal(coleccionDeBits2);
}

int Descompresor::descomprimir(){

	return obtenerParteEntera1()+obtenerParteEntera2();
}

int Descompresor::  obtenerRepresentacionDecimal(ColeccionDeBits* representacionBinaria){
	int numeroDecimal=0;
	int exponente=0;
	int termino=0;
	while(representacionBinaria->tamanio()>0){
		int bit=representacionBinaria->extraerUltimoBit();



		if(bit!=0){

			termino=utilidades.potenciaBaseDos(exponente);

			numeroDecimal=numeroDecimal+termino;

		}
		exponente++;

	}
	return numeroDecimal;
}

Descompresor::~Descompresor() {
	// TODO Auto-generated destructor stub
}

